package com.ys.io.p1字符输入输出流;

import java.io.*;
import java.util.Arrays;

/**
 * 文件字符流读与写
 *  new FileReader(String)构造方法源码如下：
 *  public FileReader(String fileName) throws FileNotFoundException {
 *         super(new FileInputStream(fileName));
 *     }
 *  由源码可以得知：当我new一个FileReader对象的时候会在内部创建一个FileInputStream对象，
 *  所以：字符流是基于字节流的
 *  ---------------------------------------------------------------------
 *  public FileInputStream(String name) throws FileNotFoundException {
 *      this(name != null ? new File(name) : null);
 *  }
 *  由源码可以得知：我使用字符串表示磁盘文件路径，在FileInputStream的构造方法中会帮我创建一个File对象
 * @author CodeYang
 * @version 2020/12/30 19:31
 */
public class 文件字符流读与写 {

    public static void main(String[] args) throws Exception {
        /**
         *  文件字符流的核心本质还是 文件字节流 只是使用char[] 而文件字节流使用 byte[]
         */
        method01();
        method02();





    }
        /**
        * 基于字符的文件输入流，用来读取磁盘文件的数据
         *
         * 构造方法如下：
         *
         * FileReader(String name): 创建一个字符文件输入流对象，参数是以字符串表示的磁盘路径
         *
         * FileReader(File file): 创建一个字符文件输入流对象，参数是以File对象表示的磁盘路径
         *
         * 成员方法如下：
         *
         * int read(char[]) :从磁盘读取多个字符数组
         *
         * int read() ：读取单个字符
         *
         * 描述 :
        ** 场景：创建FileReader对象读取数据
         *  * 步骤：
         *  * 1 定义 try with resources
         *  * 2 创建FileReader对象
         *  * 3 调用read相关方法读取数据
        * @param :
        * @return: void
        * @date: 2020/12/30 19:39
        */



    private static void method02() {

        try (Reader fileReader = new FileReader("day_23/b.txt")) {
            char[] chars = new char[1024];
            int len = fileReader.read(chars);
            System.out.println("文件字符长度:"+len+"内容:"+ Arrays.toString(chars));

            System.out.println("文件读出成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 是一个基于字符的文件输出流，用于在磁盘中对文本文件做写操作。
     *
     * ​        提供了如下的构造方法：
     *
     * ​	FileWriter(String name) :  创建一个基于字符的输出流对象，参数是使用字符串表示的磁盘路径
     *
     * ​	FileWriter(File file) ：  创建一个基于字符的输出流对象，参数是使用File对象表示的磁盘路径
     *
     * ​	FileWriter(String name ,boolean append)：  创建一个基于字符的输出流对象，参数1：是使用字符串表示的磁盘路径，参数2：追加标志位，true追加写，false 覆盖之前的内容  默认false
     *
     * ​	FileWriter(File file,boolean append)：创建一个基于字符的输出流对象，参数1：是使用File对象表示的磁盘路径，参数2：追加标志位，true追加写，false 覆盖之前的内容  默认false
     *
     * ​	提供了以下的成员方法：
     *
     * ​	write(char []):将字符数组写入磁盘
     *
     * ​	write(char[],int,int)：将部分字符数组写入磁盘，参数1：字符数组 参数2：数组的偏移量，参数3：写入字符组的长度
     *
     * ​	write(String)：将字符串写入磁盘
     *
     * ​	write(String,int,int)：将部分字符串写入磁盘
     *
     * ​	write(int)：写入单个字符
     *
     * 描述 :
     * 描述: FileWriter
     * *  文件字符流 写者
     *
     * @param :
     * @return: void
     * @date: 2020/12/30 19:38
     */
    private static void method01() {
        try (Writer fileWriter = new FileWriter("day_23/b.txt")) {
            fileWriter.write("123");
            fileWriter.write(65);
            char[] chars = {'h', 'e', 'l', 'l', 'o'};
            fileWriter.write(chars);
            fileWriter.write("word".toCharArray());
            System.out.println("文件写入成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
